<?php

namespace app\api\job;

use think\queue\Job;

class Message
{
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job
     * @param array $data
     * @author Poison
     */
    public function fire(Job $job, $data)
    {
        // 有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if (!$isJobStillNeedToBeDone) {
            $job->delete();
            return;
        }

        //调用自己的业务逻辑
        $isJobDone = $this->doOwnmessage($data);

        if ($isJobDone) {
            // 如果任务执行成功， 记得删除任务
            $job->delete();
        } else {
            $job->release(3); //$delay为延迟时间
        }
        if ($job->attempts() > 3) {
            //通过这个方法可以检查这个任务已经重试了几次了
            print("<warn>Hello Job has been retried more than 3 times!" . "</warn>\n");

            $job->delete();

            // 也可以重新发布这个任务
            //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
            //$job->release(2); //$delay为延迟时间，表示该任务延迟2秒后再执行
        }

    }

    public function failed($data)
    {
        // ...任务达到最大重试次数后，失败了
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed $data 发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data)
    {
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理...
     */
    private function doOwnmessage($data)
    {
        switch ($data['job_queue_name']) {
            case 'removeSpeakWheat':
                //自动更新抢麦用户发言状态
                \app\api\model\RtcWheat::removeSpeakWheat($data);
                break;
            case '1':


                break;
        }
        $data['time'] = date('Y-m-d H:i:s', time());
        print_r($data);
        return true;
        //根据你的业务需求写逻辑即可 成功返回true失败返回false即可
    }


}
